package controller

import (
	"context"
	"mldong/api/base"
	deptApi "mldong/api/dept"
	"mldong/internal/modules/sys/logic"
	"mldong/internal/modules/sys/service"
	"mldong/utility"

	"github.com/gogf/gf/v2/frame/g"
)

func init() {
	// 注册控制器时自动注入依赖
	utility.RegisterController(&DeptController{
		// deptService: utility.MustResolve(service.DeptServiceType).(service.IDeptService),
		// 控制层使用强依赖logic的方式，保证逻辑层的init方法比controller的方法先执行
		deptService: utility.MustResolve(service.DeptServiceType).(*logic.DeptLogic),
	})
}

type DeptController struct {
	deptService service.IDeptService
}

// 保存部门
func (ctrl *DeptController) Save(ctx context.Context, req *deptApi.SaveReq) (res *base.CommonResult, err error) {
	success, err := ctrl.deptService.Save(ctx, req)
	if err != nil {
		return
	}
	if success {
		jsonData := base.Ok()
		g.RequestFromCtx(ctx).Response.WriteJson(jsonData)
	} else {
		jsonData := base.FailWithDefaultCode("保存部门失败")
		g.RequestFromCtx(ctx).Response.WriteJson(jsonData)
	}
	return
}

// 修改部门
func (ctrl *DeptController) Update(ctx context.Context, req *deptApi.UpdateReq) (res *base.CommonResult, err error) {
	success, err := ctrl.deptService.Update(ctx, req)
	if err != nil {
		return
	}
	if success {
		jsonData := base.Ok()
		g.RequestFromCtx(ctx).Response.WriteJson(jsonData)
	} else {
		jsonData := base.FailWithDefaultCode("修改部门失败")
		g.RequestFromCtx(ctx).Response.WriteJson(jsonData)
	}
	return
}

// 删除部门
func (ctrl *DeptController) Remove(ctx context.Context, req *deptApi.RemoveReq) (res *base.CommonResult, err error) {
	success, err := ctrl.deptService.Remove(ctx, req.Ids)
	if err != nil {
		return
	}
	if success {
		jsonData := base.Ok()
		g.RequestFromCtx(ctx).Response.WriteJson(jsonData)
	} else {
		jsonData := base.FailWithDefaultCode("删除部门失败")
		g.RequestFromCtx(ctx).Response.WriteJson(jsonData)
	}
	return
}

// 获取部门详情
func (ctrl *DeptController) Detail(ctx context.Context, req *deptApi.DetailReq) (res *deptApi.DetailRes, err error) {
	// 设置 JSON 数据
	jsonData, err := ctrl.deptService.Detail(ctx, req.ID)
	if err != nil {
		return
	}
	g.RequestFromCtx(ctx).Response.WriteJson(base.Data(jsonData))
	return
}

// 分页查询部门列表
func (ctrl *DeptController) Page(ctx context.Context, req *deptApi.PageReq) (res *deptApi.PageRes, err error) {
	// 传递以m_开头的查询参数
	req.QueryParamMap = utility.GetQueryParamMap(ctx)
	jsonData, err := ctrl.deptService.Page(ctx, req)
	if err != nil {
		return
	}
	g.RequestFromCtx(ctx).Response.WriteJson(base.Data(jsonData))
	return
}

// 查询部门列表
func (ctrl *DeptController) List(ctx context.Context, req *deptApi.ListReq) (res *deptApi.ListRes, err error) {
	// 传递以m_开头的查询参数
	req.QueryParamMap = utility.GetQueryParamMap(ctx)
	jsonData, err := ctrl.deptService.List(ctx, req)
	if err != nil {
		return
	}
	g.RequestFromCtx(ctx).Response.WriteJson(base.Data(jsonData))
	return
}

// 查询部门树
func (ctrl *DeptController) Tree(ctx context.Context, req *deptApi.TreeReq) (res *deptApi.TreeRes, err error) {
	// 传递以m_开头的查询参数
	req.QueryParamMap = utility.GetQueryParamMap(ctx)
	jsonData, err := ctrl.deptService.Tree(ctx, req)
	if err != nil {
		return
	}
	g.RequestFromCtx(ctx).Response.WriteJson(base.Data(jsonData))
	return
}
